#include<iostream>
#include<stdio.h>
#include<signal.h>
#include<unistd.h>

using namespace std;

void Count(int cnt)
{
    while(cnt)
    {
        printf("cnt:%2d\r",cnt--);
        fflush(stdout);
        sleep(1);
    }
    printf("\n");
}
static void handler(int signo)
{
    cout << "get signo :" << signo << "正在处理中" << endl;
    //sleep(20);
    Count(20);
}

int main()
{
    struct sigaction act, oact;
    act.sa_handler = handler;
    act.sa_flags = 0;
    // 初始化mask
    sigemptyset(&act.sa_mask);// 当我们正在处理某一种信号的时候,我们也想顺便屏蔽其他信号,就可以添加到这个sa_mask中
    sigaddset(&act.sa_mask,3);// 正在处理2号信号时,发送3号信号;当2号信号处理结束时,3号信号屏蔽解除,被递达
    sigaction(SIGINT,&act,&oact);//2号信号捕捉

    while(true) sleep(1);
    return 0;
}


//////////////////////////////////////信号的捕捉////////////////////////////////////


// #include <signal.h>
// int sigaction(int signo, const struct sigaction *act, struct sigaction *oact); 

// struct sigaction {
//                void     (*sa_handler)(int);
//                void     (*sa_sigaction)(int, siginfo_t *, void *);
//                sigset_t   sa_mask;
//                int        sa_flags;
//                void     (*sa_restorer)(void);
//            };


//////////////////////////////////////////////////////////////////////////////////////

// 1.当我们进程正在递达某一个信号期间,同类型信号无法被递达! -- 当当前信号正在被捕捉,系统会自动将当前信号加入到进程的信号屏蔽字,block
// 当信号完成捕捉动作,系统又会自动解除对该信号的屏蔽
// 一般一个信号被接触屏蔽的时候,会自动进程递达当前屏蔽信号,如果该信号已经被pending的化,没又就不做任何动作!

// 我们进程处理信号的原则是串行处理同类型的信号,不允许递归!